package Source;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;

public class Subasta_DAO implements DAO {

	private String sentenciaSQL;
    ConexionDB conexion;
    LinkedList<Subasta_POJO> listaDetalle = new LinkedList<Subasta_POJO>();
    ResultSet resultado;
    int valor;
    private String temp;
    
    public Subasta_DAO() {
        this.conexion = new ConexionDB();
    }


    public LinkedList<Subasta_POJO> obtenerReg(int idSubasta) throws SQLException {
    
         temp = "SELECT idSubasta,fechaInicio,valorInicial,fechaExpira,status, s.idArticulo, idUsuario FROM Subasta s , Articulo a " +
         		" WHERE idSubasta =? AND a.idArticulo = s.idArticulo ";
         PreparedStatement ps=conexion.prepareStatement(temp);
         ps.setInt(1,idSubasta);
         System.out.println("Obtener "+sentenciaSQL);
         try {
        	conexion.abrirConexion();
            resultado = ps.executeQuery();
            ps.close();
            if (resultado.next()) {
                Subasta_POJO subasta = new Subasta_POJO();
                
                subasta.setIdSubasta(Integer.parseInt(resultado.getString("idSubasta")));
                subasta.setFechaExpira(resultado.getString("fechaExpira"));
                subasta.setFechaInicio(resultado.getString("fechaInicio"));
                subasta.setIdArticulo(Integer.parseInt(resultado.getString("idArticulo")));
                subasta.setStatus(Boolean.parseBoolean(resultado.getString("status")));
                subasta.setValorInicial(Double.parseDouble(resultado.getString("valorInicial")));
                subasta.setIdUsuario(Integer.parseInt(resultado.getString("idUsuario")));

                listaDetalle.add(subasta);                
            }
        } catch (Exception ex) {
            //Error lanzado
            System.out.println("Error " + ex);            
        }
        return listaDetalle;
    }
    
    public int guardarReg(String fechaInicio,Double valorInicial,String fechaExpira,Boolean status,int idArticulo  ) throws SQLException{
    	    
        temp = "INSERT INTO Subasta (fechaInicio, valorInicial, fechaExpira, status, idArticulo  ) VALUES (?,?,?,?,? )";
          PreparedStatement ps=conexion.prepareStatement(temp);
         ps.setString(1,fechaInicio);
         ps.setDouble(2,valorInicial);
         ps.setString(3,fechaExpira);
         ps.setBoolean(4,status);
         ps.setInt(5,idArticulo);
        System.out.println("Query:  "+sentenciaSQL);
        try {
       	 	conexion.abrirConexion();
            valor = ps.executeUpdate();
            ps.close();
            //System.out.println ("Delete exitoso");
            conexion.cerrarConexion();
            return valor;
            
       } catch (Exception ex) {
            System.out.println("error " + ex);
            return -1;
       }
    }

    public int actualizarReg(int idSubasta,String fechaInicio,Double valorInicial,String fechaExpira,Boolean status,int idArticulo) throws SQLException{
    
        temp = "UPDATE Subasta SET fechaInicio= ?,valorInicial=?, fechaExpira=? , status=?, idArticulo=? WHERE idSubasta=?" ;    
        PreparedStatement ps=conexion.prepareStatement(temp);
        ps.setString(1, fechaInicio);
        ps.setDouble(2, valorInicial);
        ps.setString(3,fechaExpira);
        ps.setBoolean(4, status);
        ps.setInt(5, idArticulo);
        ps.setInt(6, idSubasta);
             System.out.println("Update "+sentenciaSQL);       
             try {
            	 	conexion.abrirConexion();
                 valor = ps.executeUpdate();
                 ps.close();
                 //System.out.println ("Delete exitoso");
                 conexion.cerrarConexion();
                 return valor;
                 
            } catch (Exception ex) {
                 System.out.println("error " + ex);
                 return -1;
            }
    }
     
    public int eliminarReg (int idSubasta ) throws SQLException{
    	temp = "DELETE FROM Subasta WHERE idSubasta = ?";
        PreparedStatement ps=conexion.prepareStatement(temp);
        ps.setInt(1, idSubasta);
       // System.out.println("Delete Query: "+sentenciaSQL);
        try {
       	 	conexion.abrirConexion();
            valor = ps.executeUpdate();
            ps.close();
            //System.out.println ("Delete exitoso");
            conexion.cerrarConexion();
            return valor;
            
       } catch (Exception ex) {
            System.out.println("error " + ex);
            return -1;
       }
    }
    
    public ResultSet obtenerMasSubastados(){
    	
    	sentenciaSQL = "SELECT a.nombre, contador.NoSubastas FROM " +
    			"(SELECT idarticulo, count(*) NoSubastas FROM SUBASTA " +
    			"GROUP BY idarticulo) contador, " +
    			"(SELECT MAX(NoSubastas) FROM articulo a, " +
    			"(SELECT idarticulo, count(*) NoSubastas FROM SUBASTA " +
    			"GROUP BY idarticulo) dato ) maximo, " +
    			"articulo a " +
    			"WHERE contador.idarticulo = a.idarticulo ";
        		System.out.println("Articulos por Categoria Query: "+sentenciaSQL);
        		
        		
        		try {
                	conexion.abrirConexion();
                    resultado = conexion.getResultSet(sentenciaSQL);
                    conexion.cerrarConexion();
                    return resultado;

                } catch (Exception ex) {
                    System.out.println("error " + ex);
                    conexion.cerrarConexion();
                    return null;
                }
    	
    }
    
    public ResultSet ganadorSubasta(int idSubasta) throws SQLException{
    	
    	temp = "SELECT nombre, idSubasta FROM oferta, usuario " +
    			"where oferta.idUsuario = usuario.idUsuario " +
    			"AND oferta.valor = " +
    			"(SELECT max(valor) FROM oferta " +
    			"WHERE idSubasta = ?) " +
    			"AND idSubasta =? " ;
        
        PreparedStatement ps=conexion.prepareStatement(temp);
        ps.setInt(1,idSubasta);
    	
    	try {
        	conexion.abrirConexion();
            resultado = ps.executeQuery();
            ps.close();
            conexion.cerrarConexion();
            return resultado;

        } catch (Exception ex) {
            System.out.println("error " + ex);
            ps.close();
            conexion.cerrarConexion();
            return null;
        }
    }
}
